#ifndef _MONSTER_H_
#define _MONSTER_H_

class Monster {
public:
    virtual ~Monster() {};
    // virtual void initAttribute() = 0;
    // virtual void attack() = 0;
    void beAttack(int injured);
    bool judgeDeath();
    virtual void kill() {}
    virtual void showDetail();
protected:
    Monster() :isDeath(false){}
    Monster(int at,int bl,int exp,bool death = false) : Attack(at),Blood(bl),experience(exp),isDeath(false) {}
    bool isDeath;
    int Attack;
    int Blood;
    int experience;
    
private:
    int getAttack() { return Attack; }
    int getBlood() { return Blood; }
    int getExperience() { return experience; }
};

/* Shooter */

class AbstructShooter : public Monster {
public:
    AbstructShooter() {}
    virtual ~AbstructShooter() {}
    virtual void showDetail() { Monster::showDetail(); }
    virtual void kill() {}
    AbstructShooter(int at = 5,int bl = 5,int exp = 10) : Monster(at,bl,exp) {}
protected:
private:
};

//Origin Attribute
class Shooter1 : public AbstructShooter {
public:
    ~Shooter1() {}
    Shooter1(int at = 5,int bl = 5,int exp = 10) : AbstructShooter(at,bl,exp) {}
    void showDetail();
    void kill();
protected:
private:
};

//Double Attribute
class Shooter2 : public AbstructShooter {
public:
    ~Shooter2() {}
    Shooter2(int at = 5 * 2,int bl = 5 * 2,int exp = 10 * 2) : AbstructShooter(at,bl,exp) {}
    void showDetail();
    void kill();
protected:
private:
};

/* Master */

class AbstructMaster : public Monster {
public:
    AbstructMaster() {}
    virtual ~AbstructMaster() {}
    virtual void showDetail() { Monster::showDetail(); }
    virtual void kill() {}
    AbstructMaster(int at = 7,int bl = 3,int exp = 10) : Monster(at,bl,exp) {}

protected:
private:
};

//Origin Attribute
class Master1 : public AbstructMaster {
public:
    Master1(int at = 7,int bl = 3,int exp = 10) : AbstructMaster(at,bl,exp) {}
    ~Master1() {}
    void showDetail();
    void kill();
protected:
private:
};

//Double Attribute
class Master2 : public AbstructMaster {
public:
    Master2(int at = 7 * 2,int bl = 3 * 2,int exp = 10 * 2) : AbstructMaster(at,bl,exp) {}
    ~Master2() {}
    void showDetail();
    void kill();
protected:
private:
};

/* Meatshield */

class AbstructMeatshield : public Monster {
public:
    AbstructMeatshield() {}
    virtual ~AbstructMeatshield() {}
    virtual void showDetail() { Monster::showDetail(); }
    virtual void kill() {}
    AbstructMeatshield(int at = 3,int bl = 8,int exp = 10) : Monster(at,bl,exp) {}
    
protected:
private:
};

//Origin Attribute
class Meatshield1 : public AbstructMeatshield {
public:
    Meatshield1(int at = 3,int bl = 8,int exp = 10) : AbstructMeatshield(at,bl,exp) {}
    ~Meatshield1() {}
    void showDetail();
    void kill();
protected:
private:
};

//Double Attribute
class Meatshield2 : public AbstructMeatshield {
public:
    Meatshield2(int at = 3 * 2,int bl = 8 * 2,int exp = 10 * 2) : AbstructMeatshield(at,bl,exp) {}
    ~Meatshield2() {}
    void showDetail();
    void kill();
protected:
private:
};

#endif